// 创建请求实例
const baseURL = 'http://172.20.10.2:9091'

// 不需要token的接口列表
const noTokenApis = [
  '/api/candidate/login',
  '/api/candidate/register',
  '/api/candidate/interview'
]

// 请求拦截器
const requestInterceptor = (config) => {
  // 检查是否是登录接口
  if (noTokenApis.includes(config.url)) {
    return config
  }

  // 从本地存储获取token
  const token = uni.getStorageSync('token')
  if (token) {
    config.header = {
      ...config.header,
      'Authorization': `Bearer ${token}`
    }
  }
  return config
}

// 响应拦截器
const responseInterceptor = (response) => {
  const res = response.data
  // 如果响应数据是数字类型，直接返回
  if (typeof res === 'number') {
    return res
  }

  // 如果返回的状态码不是 200，说明接口请求失败
  if (res.code !== 200) {
    uni.showToast({
      title: res.message || '请求失败',
      icon: 'none',
      duration: 2000
    })
    return Promise.reject(new Error(res.message || '请求失败'))
  }
  return res
}

// 错误处理
const errorHandler = (error) => {
  console.error('请求错误:', error)
  if (error.statusCode) {
    // 服务器返回了错误状态码
    switch (error.statusCode) {
      case 400:
        uni.showToast({
          title: error.data?.message || '请求参数错误',
          icon: 'none',
          duration: 2000
        })
        break
      case 401:
        uni.showToast({
          title: '未授权，请重新登录',
          icon: 'none',
          duration: 2000
        })
        // 清除用户信息并跳转到登录页
        uni.removeStorageSync('candidateInfo')
        uni.reLaunch({
          url: '/pages/login/login'
        })
        break
      case 403:
        uni.showToast({
          title: '拒绝访问',
          icon: 'none',
          duration: 2000
        })
        break
      case 404:
        uni.showToast({
          title: '请求的资源不存在',
          icon: 'none',
          duration: 2000
        })
        break
      case 500:
        uni.showToast({
          title: error.data?.message || '服务器错误',
          icon: 'none',
          duration: 2000
        })
        break
      default:
        uni.showToast({
          title: error.data?.message || '请求失败',
          icon: 'none',
          duration: 2000
        })
    }
  } else {
    // 网络错误
    uni.showToast({
      title: '网络错误，请检查您的网络连接',
      icon: 'none',
      duration: 2000
    })
  }
  return Promise.reject(error)
}

// 封装请求方法
const request = (options) => {
  const config = requestInterceptor({
    url: baseURL + options.url,
    method: options.method || 'GET',
    data: options.data,
    header: options.header || {}
  })

  return new Promise((resolve, reject) => {
    uni.request({
      ...config,
      success: (res) => {
        try {
          // 检查是否是登录接口
          const isLoginApi = noTokenApis.includes(options.url)
          if (isLoginApi) {
            // 登录接口直接返回数据
            resolve(res.data)
          } else {
            const result = responseInterceptor(res)
            resolve(result)
          }
        } catch (error) {
          reject(error)
        }
      },
      fail: (error) => {
        errorHandler(error)
        reject(error)
      }
    })
  })
}

// 导出请求方法
export default {
  get: (url, data) => request({ url, method: 'GET', data }),
  post: (url, data) => request({ url, method: 'POST', data }),
  put: (url, data) => request({ url, method: 'PUT', data }),
  delete: (url, data) => request({ url, method: 'DELETE', data })
} 